/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.event.RowEditEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKDetallePedidoOp;
import pe.com.cotelasa.scp.controlador.backingBean.BKOrdenPedido;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioCategoriaArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioComposicionArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioDetallePedidoFp;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.ComposicionArticulo;
import pe.com.cotelasa.scp.entidad.DetallePedidoFp;
import pe.com.cotelasa.scp.entidad.DetallePedidoOp;
import pe.com.cotelasa.scp.entidad.FacturaProforma;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author usuario
 */
@Named(value = "MBDetallePedidoOP")
@Scope("request")
public class MBDetallePedidoOP extends MBGenerico implements Serializable {

    @Inject
    private BKOrdenPedido bKOrdenPedido;
    @Inject
    private BKDetallePedidoOp bKDetallePedidoOP;
    @Inject
    private IServicioComposicionArticulo servicioComposicionArticulo;
    @Inject
    private IServicioArticulo servicioArticulo;
    @Inject
    private IServicioDetallePedidoFp servicioDetallePedidoFp;
    @Inject
    private IServicioCategoriaArticulo servicioCategoriaArticulo;
    @Autowired
    BKSession session;

    public void nuevoDetalle() {
        this.bKDetallePedidoOP.setFormularioDetalleOrdenPedido(new DetallePedidoOp());
        this.bKDetallePedidoOP.setArticuloFormulario(new Articulo());
        this.bKDetallePedidoOP.setListaArticuloActivo(null);
        this.bKDetallePedidoOP.setListaArticuloElegir(new ArrayList<Articulo>());
        this.bKDetallePedidoOP.setListaArticuloElegido(null);
        this.bKDetallePedidoOP.setDetallePedidoFP(null);
        this.bKDetallePedidoOP.setIdDetallePedidoFP(null);
    }

    public void eliminarDetallePedidoOp(ActionEvent actionEvent) {
        DetallePedidoOp detalleEliminado = this.bKDetallePedidoOP.getCurrentDetalleOrdenPedido();
        if (detalleEliminado.getId() == null) {

            Iterator itr = this.bKDetallePedidoOP.getListaDetallePedidoOP().iterator();
            while (itr.hasNext()) {
                DetallePedidoOp deta = (DetallePedidoOp) itr.next();
                if (detalleEliminado.getIdArticulo().equals(deta.getIdArticulo())) {
                    itr.remove();
                    break;
                }
            }
        } else {

            Integer index = this.bKDetallePedidoOP.getListaDetallePedidoOP().indexOf(detalleEliminado);

            this.bKDetallePedidoOP.getListaDetallePedidoOP().remove(detalleEliminado);
            detalleEliminado.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            detalleEliminado.setFecModificacion(new Date());
            detalleEliminado.setUsrModificacion(session.getUsuario().getUsuario());
            this.bKDetallePedidoOP.getListaDetallePedidoOPEditar().set(index, detalleEliminado);
        }
        sumarDetallesPedidoOP();

    }

    public void agregarDetallePedidoOp() throws ServiceException {
        FacturaProforma fp = bKOrdenPedido.getOrdenPedidoFormulario().getIdFacturaProforma();
        DetallePedidoFp detalle = this.bKDetallePedidoOP.getDetallePedidoFP();

        for (String art : this.bKDetallePedidoOP.getListaArticuloElegir1()) {

            Articulo articulo = servicioArticulo.obtenerArticuloPorNombreComercial(art);

            DetallePedidoOp detalleOp = new DetallePedidoOp();
            detalleOp.setFecCreacion(new Date());
            detalleOp.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            detalleOp.setUsrCreacion(session.getUsuario().getUsuario());
            detalleOp.setIdArticulo(articulo);
            detalleOp.setNombreProducto(articulo.getModelo());
            detalleOp.setUnidadMedida(detalle.getUnidadMedida());
            detalleOp.setDetalle(articulo.getDetalle());
            detalleOp.setCantidad(BigDecimal.ZERO);
            detalleOp.setPesoUnitario(BigDecimal.ZERO);
            detalleOp.setPesoTotal(BigDecimal.ZERO);
            detalleOp.setPrecioUnitario(fp.getIdTipoMoneda().getId() == Constantes.TipoMoneda.SOLES ? detalle.getPrecioUnitarioSoles() : detalle.getPrecioUnitario());
            detalleOp.setPrecioTotal(BigDecimal.ZERO);
            this.bKDetallePedidoOP.getListaDetallePedidoOP().add(detalleOp);
            this.bKDetallePedidoOP.getListaDetallePedidoOPEditar().add(detalleOp);

        }
        this.bKDetallePedidoOP.setFormularioDetalleOrdenPedido(new DetallePedidoOp());

        //sumarDetallesPedidoFP();

    }

    public void agregarDetallePedidoOpPrenda() throws ServiceException {
        FacturaProforma fp = bKOrdenPedido.getOrdenPedidoFormulario().getIdFacturaProforma();
        DetallePedidoFp detalle = this.bKDetallePedidoOP.getDetallePedidoFP();
        Articulo artPrenda = detalle.getIdCotizacion().getIdArticulo();

        for (String art : this.bKDetallePedidoOP.getListaArticuloElegir1()) {
            Articulo articulo = servicioArticulo.obtenerArticuloPorNombreComercial(art);

            DetallePedidoOp detalleOp = new DetallePedidoOp();
            detalleOp.setFecCreacion(new Date());
            detalleOp.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            detalleOp.setUsrCreacion(session.getUsuario().getUsuario());
            detalleOp.setIdArticulo(articulo);
            detalleOp.setNombreProducto(articulo.getModelo());
            detalleOp.setUnidadMedida(detalle.getUnidadMedida());
            detalleOp.setDetalle(artPrenda.getDetalle());
            detalleOp.setTalla(articulo.getDetalle());
            detalleOp.setCantidad(BigDecimal.ZERO);
            detalleOp.setPesoUnitario(BigDecimal.ZERO);
            detalleOp.setPesoTotal(BigDecimal.ZERO);
            detalleOp.setPrecioUnitario(fp.getIdTipoMoneda().getNombre().equals("SOLES") ? detalle.getPrecioUnitarioSoles() : detalle.getPrecioUnitario());
            detalleOp.setPrecioTotal(BigDecimal.ZERO);

            this.bKDetallePedidoOP.getListaDetallePedidoOP().add(detalleOp);
            this.bKDetallePedidoOP.getListaDetallePedidoOPEditar().add(detalleOp);

        }

        this.bKDetallePedidoOP.setFormularioDetalleOrdenPedido(new DetallePedidoOp());


    }

    public void editarDetallePedidoOp(RowEditEvent event) {
        //BigDecimal compra = bKOrdenPedido.getOrdenPedidoFormulario().getCambioCompra();
        DetallePedidoOp detalleEditado = (DetallePedidoOp) event.getObject();

        if (detalleEditado.getId() != null) {
            Integer index = this.bKDetallePedidoOP.getListaDetallePedidoOPEditar().indexOf(detalleEditado);
            detalleEditado.setUsrModificacion(session.getUsuario().getUsuario());
            detalleEditado.setFecModificacion(new Date());
            detalleEditado.setPrecioTotal(detalleEditado.getCantidad().multiply(detalleEditado.getPrecioUnitario()));
            detalleEditado.setPesoUnitario(BigDecimal.ZERO);
            detalleEditado.setPesoTotal(BigDecimal.ZERO);
            this.bKDetallePedidoOP.getListaDetallePedidoOPEditar().set(index, detalleEditado);
        }else{
            for(DetallePedidoOp det : this.bKDetallePedidoOP.getListaDetallePedidoOPEditar()){
                if(det.getIdArticulo().getId().equals(detalleEditado.getIdArticulo().getId()) &&
                   det.getIdArticulo().getDetalle().equals(detalleEditado.getDetalle())){
                   detalleEditado.setPrecioTotal(detalleEditado.getCantidad().multiply(detalleEditado.getPrecioUnitario()));
                   detalleEditado.setPesoUnitario(BigDecimal.ZERO);
                   detalleEditado.setPesoTotal(BigDecimal.ZERO); 
                   det = detalleEditado; 
                }
            }
        }

        sumarDetallesPedidoOP();
    }

    public void sumarDetallesPedidoOP() {
        BigDecimal cantProductos = BigDecimal.ZERO;
        BigDecimal pesoTotal = BigDecimal.ZERO;
        BigDecimal montoTotal = BigDecimal.ZERO;
        Iterator it = this.bKDetallePedidoOP.getListaDetallePedidoOP().iterator();
        while (it.hasNext()) {
            DetallePedidoOp aux = (DetallePedidoOp) (it.next());
            cantProductos = cantProductos.add(aux.getCantidad());
            montoTotal = montoTotal.add(aux.getPrecioTotal());
            pesoTotal = pesoTotal.add(aux.getPesoTotal());
        }
        bKOrdenPedido.getOrdenPedidoFormulario().setCantidadTotalProductos(cantProductos);
        bKOrdenPedido.getOrdenPedidoFormulario().setPesoTotal(pesoTotal);
        bKOrdenPedido.getOrdenPedidoFormulario().setMontoTotal(montoTotal);
    }

    public void cargarListaParaElegir() {
        //this.bKDetallePedidoOP.setListaDetallePedidoOpElegir(new ArrayList<DetallePedidoOp>());
        this.bKDetallePedidoOP.setListaArticuloElegir(new ArrayList<Articulo>());
        this.bKDetallePedidoOP.setListaArticuloElegido(new ArrayList<Articulo>());



        try {
            DetallePedidoFp detalle = servicioDetallePedidoFp.conseguirDetallePedidoFpPorId(this.bKDetallePedidoOP.getIdDetallePedidoFP());
            /*System.out.println("detalle : "+detalle.getNombreProducto());
             Articulo articuloModelo = new Articulo();
             for(ComposicionArticulo articulo1:detalle.getIdCotizacion().getIdArticulo().getComposicionArticuloCollection()){
             if(articulo1.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()){
             articuloModelo = articulo1.getIdArticuloComp();
             break;
             }
             }
            
             System.out.println("articulo Modelo nombre : "+articuloModelo.getNombreComercial());
             System.out.println("articulo Modelo modelo : "+articuloModelo.getModelo());
             this.bKDetallePedidoOP.setDetallePedidoFP(detalle);
             boolean existeArticulo = false;
             boolean estaVacio = false;

             for (ComposicionArticulo composicion : articuloModelo.getArticuloComposicionCollection()) {
                
             if (composicion.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
             System.out.println("articulo composicion: "+composicion.getIdArticulo().getNombreComercial());
             Articulo articulo = composicion.getIdArticulo();
             existeArticulo = false;
             for (DetallePedidoOp detalleOp : this.bKDetallePedidoOP.getListaDetallePedidoOP()) {
             estaVacio = true;
             if (articulo.getId().equals(detalleOp.getIdArticulo().getId())) {
             existeArticulo = true;
             break;
             }

             }

             if (!existeArticulo) {

             this.bKDetallePedidoOP.getListaArticuloElegir().add(articulo);
             }


             }



             }*/
            boolean existeArticulo = false;
            boolean estaVacio = false;

            this.bKDetallePedidoOP.setDetallePedidoFP(detalle);
            System.out.println("unidade medida: " + this.bKDetallePedidoOP.getDetallePedidoFP().getUnidadMedida());
            Articulo articuloBusqueda = new Articulo();
            articuloBusqueda.setModelo(detalle.getNombreProducto());
            articuloBusqueda.setIdCategoriaArticulo(detalle.getIdCotizacion().getIdArticulo().getIdCategoriaArticulo());

            for (Articulo articulo : servicioArticulo.buscarArticulosPorModelo(articuloBusqueda)) {
                estaVacio = true;
                existeArticulo = false;

                for (DetallePedidoOp detalleOp : this.bKDetallePedidoOP.getListaDetallePedidoOP()) {

                    if (detalleOp.getIdArticulo().getId().equals(articulo.getId())) {

                        existeArticulo = true;
                        break;
                    }

                }

                if (!existeArticulo) {
                    this.bKDetallePedidoOP.getListaArticuloElegir().add(articulo);
                }

            }

            if (this.bKDetallePedidoOP.getListaArticuloElegir().isEmpty() && estaVacio) {
                mostrarWarning("Ya se agregaron todos los detalles de esta tela.");
            } else if (this.bKDetallePedidoOP.getListaArticuloElegir().isEmpty() && !estaVacio) {
                mostrarWarning("No existen detalles relacioandos a esta tela.");
            }

        } catch (ServiceException e) {
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void cargarListaParaElegirPrenda() {
        //this.bKDetallePedidoOP.setListaDetallePedidoOpElegir(new ArrayList<DetallePedidoOp>());
        this.bKDetallePedidoOP.setListaArticuloElegir(new ArrayList<Articulo>());
        this.bKDetallePedidoOP.setListaArticuloElegido(new ArrayList<Articulo>());

        try {
            DetallePedidoFp detalle = servicioDetallePedidoFp.conseguirDetallePedidoFpPorId(this.bKDetallePedidoOP.getIdDetallePedidoFP());
            Articulo articuloModelo = new Articulo();

            Articulo articuloBusqueda = new Articulo();
            articuloBusqueda.setModelo(detalle.getNombreProducto());
            List<Articulo> listaArticulos = (List<Articulo>) servicioArticulo.buscarArticulosPorModelo(articuloBusqueda);

            Iterator itr = listaArticulos.iterator();
            while (itr.hasNext()) {

                Articulo art = (Articulo) itr.next();
                if (art.equals(detalle.getIdCotizacion().getIdArticulo())) {
                    itr.remove();
                } else {
                    articuloModelo = art;
                    break;
                }
            }

            this.bKDetallePedidoOP.setDetallePedidoFP(detalle);
            boolean existeArticulo = false;

            for (ComposicionArticulo composicion : articuloModelo.getArticuloComposicionCollection()) {
                existeArticulo = false;
                Articulo articulo = composicion.getIdArticulo();
                for (DetallePedidoOp detalleOp : this.bKDetallePedidoOP.getListaDetallePedidoOP()) {
                    if (articulo.getId().equals(detalleOp.getIdArticulo().getId())) {
                        existeArticulo = true;
                        break;
                    }

                }

                if (!existeArticulo) {

                    this.bKDetallePedidoOP.getListaArticuloElegir().add(articulo);
                }


            }

            if (this.bKDetallePedidoOP.getListaArticuloElegir().isEmpty() && existeArticulo) {
                mostrarWarning("Ya se agregaron todas las tallas de esta prenda.");
            } else if (this.bKDetallePedidoOP.getListaArticuloElegir().isEmpty() && !existeArticulo) {
                mostrarWarning("No existen tallas relacioandos a esta prenda.");
            }


        } catch (ServiceException e) {
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void elegirArticulo() {
    }
}
